package org.nf.db.util.converter;

import org.nf.db.util.TypeConverter;

import java.sql.Date;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * @author wangl
 * @date 2023/4/7
 */
public class LocalDateConverter implements TypeConverter {

    /**
     * 判断是否适配LocalDate.class
     * @param fieldType
     * @return
     */
    @Override
    public boolean supports(Class<?> fieldType) {
        return fieldType.equals(LocalDate.class);
    }

    /**
     *
     * @param fieldType
     * @param value
     * @return
     *
     * 如果 value 是 LocalDate 类型，则直接返回它本身。
     * 如果 value 是 LocalDateTime 类型，则调用其 toLocalDate() 方法将其转换为 LocalDate 并返回。
     *
     * 如果 value 是 Date 类型（你将其称为 "sqlDate"，但实际上它就是 java.sql.Date），
     * 则需要进行一些转换，因为 Date 类并没有直接提供 toLocalDate() 方法。这里使用了 toInstant() 方法将其转换为 Instant(系统默认时区)，
     * 然后使用系统默认时区将其转换为 ZonedDateTime，并最终调用 toLocalDate() 将其转换为 LocalDate。
     *
     * 如果 value 是 Timestamp 类型（这通常是 java.sql.Timestamp），则调用其 toLocalDateTime() 方法将其转换为 LocalDateTime，然后再调用 toLocalDate() 将其转换为 LocalDate。
     * 如果 value 不是上述任何类型，则返回 null。
     */
    @Override
    public Object apply(Class<?> fieldType, Object value) {
        return switch (value) {
            case LocalDate localDate -> localDate;
            case LocalDateTime localDateTime -> localDateTime.toLocalDate();
            case Date sqlDate -> sqlDate.toLocalDate();
            case Timestamp timestamp -> timestamp.toLocalDateTime().toLocalDate();
            default -> null;
        };
    }
}
